home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dev / ds5000.md / devStdFB.c < prev    next >
C/C++ Source or Header  |  1992-12-18  |  7KB  |  254 lines

  1. /* 
  2.  * devStdFB.c --
  3.  *
  4.  *    Routines for the /dev/stdfb device.
  5.  *
  6.  * Copyright 1991 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that this copyright
  10.  * notice appears in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/dev/ds5000.md/devStdFB.c,v 1.2 91/08/19 13:49:05 jhh Exp $ SPRITE (Berkeley)";
  18. #endif /* not lint */
  19.  
  20. #include <sprite.h>
  21. #include <devGraphicsInt.h>
  22. #include <proc.h>
  23. #include <dev/stdfb.h>
  24. #include <devStdFBInt.h>
  25.  
  26. /*
  27.  * Info on each process that has the device open.
  28.  */
  29. typedef struct OpenInfo {
  30.     List_Links            links;        /* Link them together. */
  31.     Proc_ControlBlock        *procPtr;    /* Process with fb open. */
  32.     Address            addr;        /* Address where fb is 
  33.                          * mapped. */
  34. } OpenInfo;
  35.  
  36. static List_Links    infoList;
  37.  
  38.  
  39. /*
  40.  *----------------------------------------------------------------------
  41.  *
  42.  *  DevStdFBOpen--
  43.  *
  44.  *    Open the device.
  45.  *
  46.  * Results:
  47.  *    SUCCESS if the device was opened, FAILURE otherwise
  48.  *
  49.  * Side effects:
  50.  *    None.
  51.  *
  52.  *----------------------------------------------------------------------
  53.  */
  54.  
  55. /*ARGSUSED*/
  56. ReturnStatus
  57. DevStdFBOpen(devicePtr, useFlags, token, flagsPtr)
  58.     Fs_Device    *devicePtr;    /* Device info, unit number, etc. */
  59.     int        useFlags;    /* Flags from the stream being opened. */
  60.     Fs_NotifyToken    token;    /* Call-back token for input, unused here. */
  61.     int        *flagsPtr;    /* OUT: Device open flags. */
  62. {
  63.     int            slot;
  64.     Mach_SlotInfo    slotInfo;
  65.     char        *slotAddr;
  66.     OpenInfo        *infoPtr;
  67.     Proc_ControlBlock    *procPtr;
  68.     ReturnStatus    status = SUCCESS;
  69.  
  70.     procPtr = Proc_GetCurrentProc();
  71.     if (devicePtr->data == (ClientData) NIL) {
  72.     List_Init(&infoList);
  73.     devicePtr->data = (ClientData) &infoList;
  74.     }
  75.     slot = devicePtr->unit;
  76.     slotAddr = (char *) MACH_IO_SLOT_ADDR(slot);
  77.     status = Mach_GetSlotInfo(slotAddr + PMAGBA_ROM_OFFSET, &slotInfo);
  78.     if (status != SUCCESS) {
  79.     return status;
  80.     }
  81.     if (strcmp(slotInfo.vendor, "DEC") || 
  82.     strcmp(slotInfo.module, "PMAG-BA")) {
  83.     return FAILURE;
  84.     }
  85.     infoPtr = (OpenInfo *) malloc(sizeof(OpenInfo));
  86.     bzero((char *) infoPtr, sizeof(OpenInfo));
  87.     List_InitElement((List_Links *) infoPtr);
  88.     infoPtr->procPtr = procPtr;
  89.     infoPtr->addr = (Address) NIL;
  90.     List_Insert((List_Links *) infoPtr, LIST_ATFRONT(&infoList));
  91.     return status;
  92. }
  93.  
  94. /*
  95.  *----------------------------------------------------------------------
  96.  *
  97.  * DevStdFBMMap --
  98.  *
  99.  *    Map in the frame buffer.
  100.  *
  101.  * Results:
  102.  *    None.
  103.  *
  104.  * Side effects:
  105.  *    None.
  106.  *
  107.  *----------------------------------------------------------------------
  108.  */
  109. /*ARGSUSED*/
  110. ReturnStatus
  111. DevStdFBMMap(devicePtr, startAddr, length, offset, newAddrPtr)
  112.     Fs_Device    *devicePtr;    /* Device to map. */
  113.     Address    startAddr;    /* Where to map it.
  114.     int        length;        /* Number of bytes to map. */
  115.     int        offset;        /* Unused. */
  116.     Address    *newAddrPtr;    /* New address. */
  117. {
  118.     ReturnStatus    status = SUCCESS;
  119.     char        *fbAddr;
  120.     OpenInfo        *infoPtr = (OpenInfo *) NIL;
  121.     Proc_ControlBlock    *procPtr;
  122.     int            addr;
  123.     Boolean        found = FALSE;
  124.  
  125.     procPtr = Proc_GetCurrentProc();
  126.     LIST_FORALL((List_Links *) devicePtr->data, (List_Links *) infoPtr) {
  127.     if (infoPtr->procPtr == procPtr) {
  128.         if (infoPtr->addr != (Address) NIL) {
  129.         return FAILURE;
  130.         } else {
  131.         found = TRUE;
  132.         break;
  133.         }
  134.     }
  135.     }
  136.     if (!found) {
  137.     panic("DevStdFBMMap: info for proc 0x%x not found\n", procPtr);
  138.     return FAILURE;
  139.     }
  140.     fbAddr = (char *) MACH_IO_SLOT_ADDR(devicePtr->unit) + PMAGBA_BUFFER_OFFSET;
  141.     addr = (int) startAddr;
  142.     if (addr & VMMACH_OFFSET_MASK) {
  143.     addr += VMMACH_PAGE_SIZE;
  144.     addr &= ~VMMACH_OFFSET_MASK;
  145.     }
  146.     status = VmMach_UserMap(length, (Address) addr, (Address) fbAddr, FALSE,
  147.         (Address *) &addr);
  148.     if (status != SUCCESS) {
  149.     return status;
  150.     }
  151.     infoPtr->addr = (Address) addr;
  152.     *newAddrPtr = (Address) addr; 
  153.     return status;
  154. }
  155.  
  156. /*
  157.  *----------------------------------------------------------------------
  158.  *
  159.  *  DevStdFBIOControl --
  160.  *
  161.  *    Perform an IO control.
  162.  *
  163.  * Results:
  164.  *      GEN_NOT_IMPLEMENTED if io control not supported.  GEN_INVALID_ARG
  165.  *    if something else went wrong.  SUCCESS otherwise.
  166.  *    
  167.  *
  168.  * Side effects:
  169.  *    None.
  170.  *
  171.  *----------------------------------------------------------------------
  172.  */
  173. /*ARGSUSED*/
  174.  
  175. ReturnStatus
  176. DevStdFBIOControl(devicePtr, ioctlPtr, replyPtr)
  177.     Fs_Device    *devicePtr;    /* Handle for device. */
  178.     Fs_IOCParam    *ioctlPtr;    /* Standard I/O Control parameter block. */
  179.     Fs_IOReply    *replyPtr;    /* Size of outBuffer and returned signal. */
  180. {
  181.     Dev_StdFBInfo    info;
  182.  
  183.     switch(ioctlPtr->command) {
  184.     case IOC_STDFB_INFO: {
  185.         if (ioctlPtr->outBufSize < sizeof (Dev_StdFBInfo)) {
  186.         return GEN_INVALID_ARG;
  187.         }
  188.         info.type = PMAGBA;
  189.         info.height = PMAGBA_HEIGHT;
  190.         info.width = PMAGBA_WIDTH;
  191.         info.planes = PMAGBA_PLANES;
  192.         bcopy((char *) &info, (char *) ioctlPtr->outBuffer, sizeof(info));
  193.         break;
  194.     }
  195.     default: 
  196.         return GEN_NOT_IMPLEMENTED;
  197.     }
  198.     return SUCCESS;
  199. }
  200.  
  201. /*
  202.  *----------------------------------------------------------------------
  203.  *
  204.  * DevStdFBClose --
  205.  *
  206.  *    Close the device
  207.  *
  208.  * Results:
  209.  *    None.
  210.  *
  211.  * Side effects:
  212.  *    None.
  213.  *
  214.  *----------------------------------------------------------------------
  215.  */
  216. /*ARGSUSED*/
  217. ReturnStatus
  218. DevStdFBClose(devicePtr, useFlags, openCount, writerCount)
  219.     Fs_Device   *devicePtr;        /* Information about device. */
  220.     int         useFlags;        /* Indicates whether stream being
  221.                      * closed was for reading and/or
  222.                      * writing:  OR'ed combination of
  223.                      * FS_READ and FS_WRITE. */
  224.     int         openCount;        /* # of times this particular stream
  225.                      * is still open. */
  226.     int         writerCount;        /* # of times this particular stream
  227.                      * is still open for writing. */
  228. {
  229.     ReturnStatus    status = SUCCESS;
  230.     OpenInfo        *infoPtr = (OpenInfo *) NIL;
  231.     Proc_ControlBlock    *procPtr;
  232.  
  233.     procPtr = Proc_GetCurrentProc();
  234.     LIST_FORALL((List_Links *) devicePtr->data, (List_Links *) infoPtr) {
  235.     if (infoPtr->procPtr == procPtr) {
  236.         break;
  237.     }
  238.     }
  239.     if (infoPtr->addr != (Address) NIL) {
  240.     status = VmMach_UserUnmap(infoPtr->addr);
  241.     if (status != SUCCESS) {
  242.         printf("DevFBClose: couldn't unmap frame buffer\n");
  243.         return FAILURE;
  244.     }
  245.     }
  246.     List_Remove((List_Links *) infoPtr);
  247.     free((char *) infoPtr);
  248.     if (openCount == 0) {
  249.     devicePtr->data = (ClientData) NIL;
  250.     }
  251.     return status;
  252. }
  253.  
  254.